package org.lsp.opencvauto.ocr;

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class OCRInstanst {

    // 缓存：防止重复创建相同配置的 Tesseract 实例
    private static final ConcurrentMap<String, ITesseract> INSTANCE_CACHE = new ConcurrentHashMap<>();

    //默认使用的数据路径
    private static final  String DATA_PATH="D:\\Software\\tessseractOcr\\tessdata";
    //默认使用的语言
    private static  final  String LANGUAGE="chi_sim";

    // 工具类禁止实例化
    private OCRInstanst() {
        throw new UnsupportedOperationException("Utility class cannot be instantiated.");
    }

    /**
     * 获取指定配置的 Tesseract 实例（缓存复用）
     *
     * @param datapath       tessdata 文件夹路径
     * @param language       语言代码（如 chi_sim、eng）
     * @param isNumericOnly  是否只识别数字
     * @return 配置好的 Tesseract 实例
     */
    public static ITesseract getTesseractInstance(String datapath, String language, boolean isNumericOnly) {
        String key = datapath + "_" + language + "_" + isNumericOnly;
        return INSTANCE_CACHE.computeIfAbsent(key, k -> createTesseractInstance(datapath, language, isNumericOnly));
    }

    /**
     * 创建并配置 Tesseract 实例
     */
    private static ITesseract createTesseractInstance(String datapath, String language, boolean isNumericOnly) {
        ITesseract tesseract = new Tesseract();  // JNA 接口映射
        tesseract.setDatapath(datapath);
        tesseract.setLanguage(language);
        if (isNumericOnly) {
            // 直接设置字符白名单（0-9），替代 Config 类
            tesseract.setVariable("tessedit_char_whitelist", "0123456789");
        }

        return tesseract;
    }

    private static ITesseract createTesseractInstance() {
        ITesseract tesseract = new Tesseract();  // JNA 接口映射
        tesseract.setDatapath(DATA_PATH);
        tesseract.setLanguage(LANGUAGE);

        return tesseract;
    }


    /**
     * 静态 OCR 方法：直接调用即可执行 OCR 识别
     *
     * @param imagePath     图像文件路径
     * @param datapath      tessdata 文件夹路径
     * @param language      语言代码（如 chi_sim、eng）
     * @param isNumericOnly 是否只识别数字
     * @return 识别结果
     */
    public static String doOCR(String imagePath, String datapath, String language, boolean isNumericOnly) {
        ITesseract tesseract = getTesseractInstance(datapath, language, isNumericOnly);
        try {
            return tesseract.doOCR(new File(imagePath));
        } catch (TesseractException e) {
            throw new RuntimeException("OCR 执行失败", e);
        }
    }



    public static String doOCR(String imagePath) {
        ITesseract instance = new Tesseract();  // JNA 接口映射
        instance.setDatapath(DATA_PATH); // 替换自己的 tessdata 路径
        instance.setLanguage("chi_sim");
        try {
            return instance.doOCR(new File(imagePath));
        } catch (TesseractException e) {
            throw new RuntimeException("OCR 执行失败", e);
        }
    }

    /**
     * 快捷方法：直接执行数字识别（默认使用英文语言）
     *
     * @param imagePath 图像文件路径
     * @return 识别出的数字字符串
     */
    public static String doNumericOCR(String imagePath) {
        return doOCR(imagePath, DATA_PATH, "eng", true); // 默认使用英文语言进行数字识别
    }

    public static String doNumericOCR(String imagePath, String language) {
        return doOCR(imagePath, DATA_PATH, language, true);
    }


}